package NarkyPackage;
import java.awt.event.KeyEvent;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyListener;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Image;
import javax.swing.JApplet;
import java.io.IOException;
import java.io.InputStream;
import java.awt.Graphics2D;
import java.awt.RenderingHints;



/**
 * Esta clase es la primera en responder cuando el juego se carga. Su tarea es preparar al
 * usuario para iniciar el juego. Esta clase contiene los elementos para dibujar en la pantalla el 
 * menu de ayuda, los creditos, la lista de high-scores, y le permite al usuario cambiar la 
 * configuracion del juego. Una vez que el usuario quiere jugar, esta clase, desde su menu inicial 
 * le da esta opcion al usuario. 
 * 
 * NOTA: Dado que Applet tiene que manejar varios menus, cada menu puede grabar su estado, 
 * para que cuando el applet mande a redibujar el menu despues de que el usuario presione 
 * alguna tecla el metodo pueda hacerlo.
 * 
 * @author GameTECH
 * @version 1.0
 *
 */
public class NarkyApplet extends JApplet implements KeyListener {

	public static final long serialVersionUID = 3;

	private int estadoDeDibujo;
	private int[] memoriaDelMenu={0,0,0,0,0};
	private Juego juego = null;
	private NarkyApplet applet = this;
	private ConfiguracionDeTeclas conf;
	public ReproductorDeSonido sonido;
	private int dificultad;
	public static final int APP_WIDTH = 600;
	public static final int APP_HEIGHT = 600;
	private static final int menuDeInicio = 0;
	private static final int menuDeAyuda = 1;
	private static final int menuDeConfiguracion = 2;
	private static final int dibujarCreditos = 3;
	private static final int jugando = 5;
	private static final int menuDeTeclado = 6;
	private static final int gane = 7;
	private boolean esperatecla=false;
	private KeyEvent teclaPresionada = null;
	private Image estrella;

	public Font narkyFont;


	public void start()
	{
		javax.swing.Timer timer = new javax.swing.Timer(500,new ActionListener(){
			public void actionPerformed(ActionEvent ae){
				applet.requestFocus();
			} 
		});
		timer.setRepeats(false);
		timer.start();
	}

	public NarkyApplet() {
		super();

		try {
			InputStream fontStream = this.getClass().getResourceAsStream("imgs/MarkerFelt.ttf");
			narkyFont = Font.createFont(Font.TRUETYPE_FONT, fontStream);
			fontStream.close();
		} catch (IOException e) {
			System.out.println(e);
		} catch (FontFormatException e) {
			System.out.println(e);
		}

		conf = new ConfiguracionDeTeclas(KeyEvent.VK_UP,
				KeyEvent.VK_DOWN, KeyEvent.VK_RIGHT, KeyEvent.VK_LEFT, 
				KeyEvent.VK_SPACE);
		sonido = new ReproductorDeSonido();
		this.addKeyListener(this);
		this.setVisible(true);
		this.setFocusable(true);
		this.requestFocus();
		this.requestFocusInWindow();
		this.requestFocus();
		estadoDeDibujo = NarkyApplet.menuDeInicio;
		dificultad=1;
		estrella=this.cargarImagen("RESIZEEstrella");
	}

	/**
	 * Contiene el c�digo necesario para cargar una imagen.
	 * Seg�n el n�mero que reciba.
	 * @param imagen El numero de la imagen que se va a cargar
	 * @return       La imagen
	 */
	public Image cargarImagen(int imagen) {

		java.net.URL url;

		url = this.getClass().getResource("imgs/" + (imagen+1) + ".png");
		return new javax.swing.ImageIcon (url).getImage();
	}

	/**
	 * Contiene el c�digo necesario para cargar una imagen.
	 * Seg�n el string que reciba.
	 * @param imagen El numero de la imagen que se va a cargar
	 * @return       La imagen
	 */
	public Image cargarImagen(String imagen) {
		java.net.URL url;

		url = this.getClass().getResource("imgs/" + imagen + ".png");
		return new javax.swing.ImageIcon (url).getImage();
	}

	/**
	 * M�todo hecho para que el juego que se tiene cargado le avise al Applet
	 * que el juego ya se termin� y que despliegue el men� principal otra vez.
	 */
	public void juegoTerminado() {
		estadoDeDibujo = 0;
		this.addKeyListener(this);
		if (juego != null) {
			juego.detener();
			this.remove(juego);
			juego = null;
		}
		this.repaint();
	}

	/**
	 * guarda la el evento del teclado en memoria y
	 * luego manda a llamar al metodo redibujar
	 * 
	 * @param e Evento de la tecla.
	 */
	public void keyPressed(KeyEvent e) {
		this.teclaPresionada = e;
		this.repaint();
	}

	public void keyReleased(KeyEvent e) {

	}



	public void keyTyped(KeyEvent e) {

	}

	/**
	 * Dibuja al menu de inicio, si el evento del teclado es null
	 * entonces es la primera vez que se dibuja este menu, por tanto
	 * dibuja como seleccionada entonces la primera opcion. Si el
	 * evento es un movimiento de las flechas entonces dibuja al menu
	 * marcando como seleccionado el nuevo item. Si el evento no es
	 * valido, solo se redibuja. Graba el estado actual del menu. 
	 * 
	 * @param g Instancia de Graphics para dibujar
	 */
	private void dibujarMenuDeInicio(Graphics g) {
		KeyEvent e = teclaPresionada;
		teclaPresionada = null;

		Graphics2D g2d = (Graphics2D)g;
		g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
		g.setFont(narkyFont.deriveFont(Font.BOLD, 32));
		g.setColor(new Color(0,0,33));
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		g.setColor(Color.white);
		g.drawImage(this.cargarImagen("RESIZEBanner"), 50,100, 500, 100, null); //narkykonglogo0
		g.drawString("Jugar", 100,300); //juego1
		g.drawString("Opciones", 100,350); //opcione2
		g.drawString("Creditos", 100,400); //puntajes3
		g.drawString("Ayuda", 100,450); //ayuda4u
		if (e != null) {
			if ((e.getKeyCode() == KeyEvent.VK_DOWN)&&memoriaDelMenu[0]<3) {
				memoriaDelMenu[0]++;  //por el tiempo del key pressed esta cosa suma 2 en realidad
			}
			if ((e.getKeyCode() == KeyEvent.VK_UP)&&memoriaDelMenu[0]>0) {
				memoriaDelMenu[0]--;
			}

			if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE){
				sonido.play("disparar");
				switch (memoriaDelMenu[0]){
				case 0: estadoDeDibujo=NarkyApplet.jugando; repaint(); return;
				case 1: estadoDeDibujo=NarkyApplet.menuDeConfiguracion; repaint(); return;
				case 2: estadoDeDibujo=NarkyApplet.dibujarCreditos; repaint(); return;
				case 3: estadoDeDibujo=NarkyApplet.menuDeAyuda; repaint(); return;
				}
			}
		}

		g.setColor(new Color(255,140,0));
		switch	(memoriaDelMenu[0]){
		case 0:	g.drawImage(estrella, 60,272, 30, 30, new Color (0,0,33) ,null);
			g.drawString("Jugar" ,100,300); break;
		case 1: g.drawString("Opciones", 100,350);
		g.drawImage(estrella, 60,322, 30, 30, new Color (0,0,33) ,null);break;
		case 2: g.drawString("Creditos", 100,400);
		g.drawImage(estrella, 60,372, 30, 30, new Color (0,0,33) ,null);break;
		case 3: g.drawString("Ayuda", 100,450);
		g.drawImage(estrella, 60,422, 30, 30, new Color (0,0,33) ,null);break;
		}


	}


	/**
	 * Dibuja la pantalla, si el evento del teclado es null entonces es
	 * la primera vez que se dibuja esta pantalla,  por tanto dibuja la
	 * primer seccion de la ayuda. Si el evento es un movimiento de las
	 * flechas entonces dibuja la pantalla en la seccion de ayuda
	 * apropiada. Si el evento no es valido, solo se redibuja. Graba la
	 * seccion que se esta desplegando. 
	 * 
	 * @param e Posible evento del teclado
	 */
	private void dibujarAyuda(Graphics g) {
		KeyEvent e = teclaPresionada;
		teclaPresionada = null;

		if (e != null) {
			if (e.getKeyCode() == KeyEvent.VK_RIGHT &&memoriaDelMenu[3]<2) {
				memoriaDelMenu[3]++;
				memoriaDelMenu[4]=1;
				repaint();
				return;
			}
			if (e.getKeyCode() == KeyEvent.VK_LEFT &&memoriaDelMenu[3]>0) {
				memoriaDelMenu[3]--;
				memoriaDelMenu[4]=0;
				repaint();
				return;
			}
			if (e.getKeyCode() == KeyEvent.VK_DOWN) {
				memoriaDelMenu[4]=2;
				repaint();
				return;
			}
			if (e.getKeyCode() == KeyEvent.VK_UP) {
				memoriaDelMenu[4]=0;
				repaint();
				return;
			}
			if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE) {
				if(memoriaDelMenu[4]==2){
					estadoDeDibujo=NarkyApplet.menuDeInicio; repaint();
					return;
				}
				if(memoriaDelMenu[4]==0&&memoriaDelMenu[3]>0){
					memoriaDelMenu[3]--;
				}
				if(memoriaDelMenu[4]==1&&memoriaDelMenu[3]<2){
					memoriaDelMenu[3]++;
				}
			}
		}

		Graphics2D g2d = (Graphics2D)g;
		//g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
		//      (RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB));
		g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
		g.setFont(narkyFont.deriveFont(Font.BOLD, 32));
		g.setColor (new Color(0,0,33));
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		g.setColor(new Color(221, 221, 204));
		g.drawString("Ayuda", 50,50);
		g.drawString("Regresar", 400, 550);
	    g.drawString(">>", 450, 450);
		g.drawString("<<", 100, 450);
		g.setColor(new Color(255,140,0));
		switch(memoriaDelMenu[4]){
		case 0: g.drawString("<<", 100, 450);break;
		case 1:g.drawString(">>", 450, 450);break;
		case 2:g.drawImage(estrella, 360,522, 30, 30, new Color (0,0,33) ,null); g.drawString("Regresar", 400, 550);break;
		}
		g.setColor(Color.white);
		switch(memoriaDelMenu[3]){	
		case 0:{
		    g.setFont(narkyFont.deriveFont(Font.BOLD, 16));
			g.drawString("Introducción:", 80, 100);
			g.drawString("Mario, un condecorado agente ministerial esta por retirarse", 90, 130);
			g.drawString("de la organización y tiene muchas cuentas por pagar. En su ", 90, 160);
			g.drawString("última misión se le ha encomendado detener a una banda de", 90, 190);
			g.drawString("narcotraficantes encabezada por el capo mas temido de", 90, 220);
			g.drawString("todos, Narky Kong.", 90, 250);
			g.drawString("El objetivo de Mario es llegar a la cima para recuperar el maletin ", 90, 300);
			g.drawString(" lleno  de dolares de las manos de Narky Kong.", 90, 320);
			g.drawString("Página 1 de 3", 240, 450);
			//g.setFont(narkyFont.deriveFont(Font.BOLD, 32));
			//g.drawImage(estrella, 360,472, 30, 30, new Color (0,0,33) ,null);
		
			//g.setColor(new Color(255,140,0));
	        break;
		}
		
		case 1:{
			  g.setFont(narkyFont.deriveFont(Font.BOLD, 16));
				g.drawString("¿Cómo utilizar los menús?", 80, 100);
				g.drawString("Guíate con las flechas para desplazarte a través del", 90, 130);
				g.drawString("menú y pulsa Enter cuando estés de acuerdo en la ", 90, 160);
				g.drawString("selección desplegada en naranja.", 90, 190);
				g.drawString("En la pantalla principal puedes comenzar un juego,", 90, 240);
				g.drawString("modificar su configuración en ¨opciones¨, consultar", 90, 270);
				g.drawString("los mejores puntajes o accesar al menú de ayuda.", 90, 300);
				g.drawString("En el menú de opciones puedes silenciar el juego,", 90, 330);
				g.drawString("cambiar la dificultad y configurar a tu gusto las", 90, 360);
				g.drawString("teclas que se usan para jugar.", 90, 390);
				g.drawString("Página 2 de 3", 240, 450);
				break;
		}
		case 2:{
			  g.setFont(narkyFont.deriveFont(Font.BOLD, 16));
				g.drawString("¿Cómo jugar?", 80, 100);
				g.drawString("Para ayudar a Mario en su búsqueda por el maletín,", 90, 130);
				g.drawString("utiliza las flechas del teclado para moverte de un", 90, 160);
				g.drawString("lado a otro. Para saltar usa la flecha hacia arriba", 90, 190);
				g.drawString("(saltar es útil cuando se aproximan las cargas explosivas).", 90, 220);
				g.drawString("Para disparar utiliza la tecla espacio (ten presente", 90, 270);
				g.drawString("que esta es la única manera de eliminar a tus enemigos).", 90, 300);
				g.drawString("Para pausar el juego oprime la tecla “P”; si quieres", 90, 330);
				g.drawString("reanudarlo vuelve a oprimirla. Para quitar el juego", 90, 360);
				g.drawString("oprime la tecla ''Q'' y regresarás al menú de inicio.", 90, 390);
				g.drawString("Página 3 de 3", 240, 450);
				break;
		}
		
		}
	}
		
	

	/**
	 * Dibuja al menu de inicio, si el evento del teclado es null entonces
	 * es la primera vez que se dibuja este menu, por tanto dibuja como
	 * seleccionada entonces la primera opcion. Si el evento es un
	 * movimiento de las flechas entonces dibuja al menu marcando como
	 * seleccionado el nuevo item. Si el evento no es valido, solo se
	 * redibuja. Graba el estado actual del menu. 
	 * 
	 * @param g Instancia de Graphics para dibujar
	 */
	private void menuDeConfiguracion(Graphics g) {
		KeyEvent e = teclaPresionada;
		teclaPresionada = null;
		Image mute, noMute, intermedio, principiante, avanzado;
		mute=this.cargarImagen("RESIZEMute");
		noMute=this.cargarImagen("RESIZENoMute");
		intermedio=this.cargarImagen("RESIZEIntermedio");
		avanzado=this.cargarImagen("RESIZEAvanzado");
		principiante=this.cargarImagen("RESIZEPrincipiante");
		Graphics2D g2d = (Graphics2D)g;
		//g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
          //      (RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB));
		g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
		g.setFont(narkyFont.deriveFont(Font.BOLD, 32));
		g.setColor (new Color(0,0,33));
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		g.setColor(new Color(221, 221, 204));
		g.drawString("OPCIONES", 50, 50);
		g.drawString("Sonido", 100, 120);

		g.drawString("Teclado", 100, 160);
		g.drawString("Dificultad", 100, 200);
		g.drawString("Facil", 350, 200);
		g.drawString("Dificil", 350, 240);
		g.drawString("Extremo", 350, 280);
		g.drawString("Ayuda", 100, 310);
		g.drawString("Aceptar", 400, 500);
		if(!sonido.getMuted()){
			g.drawImage(noMute, 260, 95, 30, 30, null);
		}else{
			g.drawImage(mute, 260, 95, 30, 30, null);}
		g.drawImage(principiante, 510, 175, 30, 30, null);
		g.drawImage(intermedio, 510, 215, 30, 30, null);
		g.drawImage(avanzado, 510, 255, 30, 30, null);
		if (e != null) {
			if ((e.getKeyCode() == KeyEvent.VK_DOWN)&&memoriaDelMenu[1]<4) {
				memoriaDelMenu[1]++; 
			}
			if ((e.getKeyCode() == KeyEvent.VK_UP)&&memoriaDelMenu[1]>0) {
				memoriaDelMenu[1]--;
			}

			if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE){
				switch (memoriaDelMenu[1]){
				case 0: sonido.setMuted(!sonido.getMuted()); repaint() ;break;	
				case 1: estadoDeDibujo=NarkyApplet.menuDeTeclado; repaint(); return;
				case 2:{
					if(dificultad==3)
						dificultad=1;
					else 
						dificultad++;
					break;}
				case 3: estadoDeDibujo=NarkyApplet.menuDeAyuda; repaint(); return;
				case 4: estadoDeDibujo=NarkyApplet.menuDeInicio; repaint(); return;
				}
			}
			if(e.getKeyCode()== KeyEvent.VK_RIGHT &&memoriaDelMenu[1]==2){
				if(dificultad==3)
					dificultad=1;
				else 
					dificultad++;
			}
		}

		g.setColor(new Color(255,140,0));
		switch	(memoriaDelMenu[1]){
		case 0: g.drawString("Sonido" ,100,120);
		g.drawImage(estrella, 60,92, 30, 30, new Color (0,0,33) ,null);break;
		case 1: g.drawString("Teclado", 100,160);
		g.drawImage(estrella, 60,132, 30, 30, new Color (0,0,33) ,null);break;
		case 2: g.drawString("Dificultad", 100,200);
		g.drawImage(estrella, 60,172, 30, 30, new Color (0,0,33) ,null);break;
		case 3: g.drawString("Ayuda", 100,310);
		g.drawImage(estrella, 60,282, 30, 30, new Color (0,0,33) ,null);break;
		case 4: g.drawString("Aceptar", 400,500);
		g.drawImage(estrella, 360,472, 30, 30, new Color (0,0,33) ,null);
		}
		g.setColor(Color.orange);

		switch (dificultad){
		case 1:	g.drawString("Facil", 350, 200); break;
		case 2: g.drawString("Dificil", 350, 240); break;
		case 3:g.drawString("Extremo", 350, 280); break;
		}


	}



	/**
	 *  Dibuja la pantalla de creditos si el evento es nulo o no es la
	 *  tecla de salir. Sino cambia el menu a dibujar a 'menu de inicio'. 
	 *  
	 * @param g Instancia de Graphics para dibujar
	 */
	private void dibujarCreditos(Graphics g) {
		KeyEvent e = teclaPresionada;
		teclaPresionada = null;

		if (e != null) {
			if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE) {
				estadoDeDibujo = NarkyApplet.menuDeInicio;
				repaint();
				return;
			}
		}
		Graphics2D g2d = (Graphics2D)g;
		//g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
		//      (RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB));
		g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
		g.setFont(narkyFont.deriveFont(Font.BOLD, 32));
		g.setColor (new Color(0,0,33));
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		g.setColor(new Color(221, 221, 204));
		g.drawString("Creditos", 50, 50);
		g.drawString("Hecho por:", 70, 100);
		g.drawString("Salvador Gonzalez Salas", 90, 150);
		g.drawString("Nicol Joan Rafalowski", 90, 190);
		g.drawString("Luis Manuel Rojas", 90, 230);
		g.drawString("Miguel Angel Lomeli", 90, 270);
		g.setColor (new Color(221,100,33));
		g.drawImage(estrella, 360,472, 30, 30, new Color (0,0,33) ,null);
		g.drawString("Regresar", 400, 500);
	}

	private void menuDeTeclado(Graphics g){
		KeyEvent e = teclaPresionada;
		teclaPresionada = null;
		Graphics2D g2d = (Graphics2D)g;
		//g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
		//      (RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB));
		g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
		g.setFont(narkyFont.deriveFont(Font.BOLD, 32));
		g.setColor(new Color(0,0,33));
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		g.setColor(Color.white);
		g.drawString("Configurar Teclado", 50, 50);
		g.setFont(narkyFont.deriveFont(Font.BOLD, 18));
		g.drawString("Selecciona la tecla que quieras modificar", 60, 90);
		g.setFont(narkyFont.deriveFont(Font.BOLD, 32));
		g.drawString("Arriba", 70, 160);
		g.drawString("Abajo", 70, 210);
		g.drawString("Izquierda", 70, 260);
		g.drawString("Derecha", 70, 310);
		g.drawString("Disparo", 70, 360);
		g.drawString("Aceptar", 400, 500);
		g.drawString(KeyEvent.getKeyText(conf.getArriba()), 350, 160);
		g.drawString(KeyEvent.getKeyText(conf.getAbajo()), 350, 210);
		g.drawString(KeyEvent.getKeyText(conf.getIzquierda()), 350, 260);
		g.drawString(KeyEvent.getKeyText(conf.getDerecha()), 350, 310);
		g.drawString(KeyEvent.getKeyText(conf.getDisparar()), 350, 360);


		if (e != null) {
			if(esperatecla){
				switch(memoriaDelMenu[2]){
				case 0:	conf.setArriba(e.getKeyCode());break;
				case 1:conf.setAbajo(e.getKeyCode());break;
				case 2:conf.setIzquierda(e.getKeyCode());break;
				case 3:conf.setDerecha(e.getKeyCode());break;
				case 4:conf.setDisparar(e.getKeyCode());break;
				}
				esperatecla=false;
				repaint();
				return;
			}
			else{

				if (e.getKeyCode()== KeyEvent.VK_RIGHT ||e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE) {
					if(memoriaDelMenu[2]==5){
						estadoDeDibujo=NarkyApplet.menuDeInicio;repaint();
					}else
						esperatecla=true; repaint();
						return;
				}

				if ((e.getKeyCode() == KeyEvent.VK_DOWN)&&memoriaDelMenu[2]<5) {
					memoriaDelMenu[2]++; 
				}
				if ((e.getKeyCode() == KeyEvent.VK_UP)&&memoriaDelMenu[2]>0) {
					memoriaDelMenu[2]--;
				}
			}
		}

		g.setColor(new Color(255,140,0));
		switch(memoriaDelMenu[2]){
		case 0:	g.drawString("Arriba", 70, 160);
		g.drawImage(estrella, 30,132, 30, 30, new Color (0,0,33) ,null);break;
		case 1:g.drawString("Abajo", 70, 210);
		g.drawImage(estrella, 30,182, 30, 30, new Color (0,0,33) ,null);break;
		case 2:g.drawString("Izquierda", 70, 260);
		g.drawImage(estrella, 30,232, 30, 30, new Color (0,0,33) ,null);break;
		case 3:g.drawString("Derecha", 70, 310);
		g.drawImage(estrella, 30,282, 30, 30, new Color (0,0,33) ,null);break;
		case 4:g.drawString("Disparo", 70, 360);
		g.drawImage(estrella, 30,332, 30, 30, new Color (0,0,33) ,null);break;
		case 5:g.drawString("Aceptar", 400, 500);
		g.drawImage(estrella, 360,472, 30, 30, new Color (0,0,33) ,null);break;
		}

	if(esperatecla){
    g.setColor(new Color(25,25,25,200));
	g.fillRect(0, 0, this.getWidth(),this.getHeight());
	g.setColor(new Color(255,140,0));
	g.drawString("Ingrese la tecla deseada",100,300);
		
		}
	}


	/**
	 * Crea una nueva instancia de la clase juego, pasandole todos los
	 * datos de configuracion que se desea tenga ese juego. Le cede el
	 * control del teclado y de la pantalla para que este se pueda
	 * dibujar solo.
	 */
	private void hacerJuegoNuevo() {
		if (juego != null) {
			juego.detener();
			this.remove(juego);
		}
		this.removeKeyListener(this);
		juego = new Juego(conf, this, dificultad);
		this.add(juego);
	}

	/**
	 * Dibuja un fondo y luego manda a llamar al metodo que dibuje el
	 * menu en el que el juego se encuentra.
	 */
	public void paint(Graphics g) {
		//Dibujar fondo
		//aqui borré un código que ponía un fondo negro pq no entendí qué hacía. atte lome.
		switch (estadoDeDibujo) {
		case NarkyApplet.menuDeInicio:
			dibujarMenuDeInicio(g);
			break;
		case NarkyApplet.menuDeAyuda:
			dibujarAyuda(g);
			break;
		case NarkyApplet.menuDeConfiguracion:
			menuDeConfiguracion(g);
			break;
		case NarkyApplet.dibujarCreditos:
			dibujarCreditos(g);
			break;
		case NarkyApplet.jugando:
			if (juego != null) {
				juego.repaint();}
			else {
				hacerJuegoNuevo();
			}
			break;
		case NarkyApplet.menuDeTeclado:
			menuDeTeclado(g);
			break;
		case NarkyApplet.gane:
			dibujarGane(g);
			break;
		}
	}

	/**
	 * Metodo que usa una instancia de Juego para avisarle al Applet que el
	 * jugador gano.
	 */
	public void gane () {
		estadoDeDibujo = NarkyApplet.gane;
		this.addKeyListener(this);
		if (juego != null) {
			juego.detener();
			this.remove(juego);
			juego = null;
		}
		this.repaint();
	}

	/**
	 * Dibuja una pantalla que felicita al usuario por haber ganado
	 * 
	 * @param g Instancia de Graphics para dibujar
	 */
	private void dibujarGane(Graphics g) {
		KeyEvent e = teclaPresionada;
		teclaPresionada = null;

		if (e != null) {
			if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE) {
				estadoDeDibujo = NarkyApplet.menuDeInicio;
				repaint();
				return;
			}
		}

		Graphics2D g2d = (Graphics2D)g;
		//g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
				//      (RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB));
		g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
		g.setFont(narkyFont.deriveFont(Font.BOLD, 32));
		g.setColor(new Color(0,0,33));

		//Background
		g.fillRect(0, 0, this.getWidth(), this.getHeight());

		//Texto
		g.setColor(Color.white);
		g.drawString("Ganaste!! presiona enter para continuar.", 30, 100);
		g.drawImage(this.cargarImagen("RESIZEMarioGanadorConMaletin"), 250, 200, 300, 400, null);

	}
}
